package com.tcm.service;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.tcm.entity.dto.CorrectExerciseDto;
import com.tcm.entity.dto.ItemCorrectDto;
import com.tcm.entity.vo.ItemCorrectResp;
import com.tcm.entity.vo.TopicRespPage;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * 题目业务接口
 * @author Guqier
 * @version 1.0
 * @date 2023/8/20 20:34
 */
public interface ItemService {

    /**
     * 根据章节获取题目
     * @param chapterId  章节ID
     * @param current    当前题目数
     * @param currUserId 当前登录用户ID
     * @return 题目信息
     */
    TopicRespPage getItemsByChapter(Long chapterId, Integer current, Long currUserId);

    /**
     * 根据试卷获取题目
     * @param testPaperId 试卷ID
     * @param current     当前题号
     * @param currUserId  当前登录用户ID
     * @return 题目信息
     */
    TopicRespPage getItemsByTestPaper(Long testPaperId, Integer current, Long currUserId);

    /**
     * 根据用户获取每日一练题目
     * @param currUserId 当前登录用户ID
     * @return 每日一练题目
     */
    TopicRespPage getItemsByDailyExercise(Long currUserId);

    /**
     * 根据难度获取题目
     * @param difficultyId 难度ID
     * @param courseId 课程ID
     * @param current 当前题目数
     * @param currUserId 当前登录用户ID
     * @return 题目
     */
    TopicRespPage getItemsByDifficulty(Long difficultyId, Long courseId, Integer current, Long currUserId);

    /**
     * 随机获取题目
     * @param courseId 课程ID
     * @param currUserId 当前用户ID
     * @return 题目信息
     */
    TopicRespPage getItemsByRandom(Long courseId, Long currUserId);

    /**
     * 根据类型获取题目
     * @param current 当前题目数
     * @param courseId 课程ID
     * @param type 题目类型
     * @param currUserId 当前用户ID
     * @return 题目信息
     */
    TopicRespPage getItemsByType(Integer current, Long courseId, Integer type, Long currUserId);

    /**
     * 计算题目总分
     * @param item 题目实体
     * @return 题目总分
     */
    Integer calculateItemTotalScore(Object item);

    /**
     * 批量评判按章节练习题目
     * @param dtos       题目答案封装列表
     * @param currUserId 当前登录用户ID
     * @return 评判结果集
     * @throws JsonProcessingException Json序列化异常
     */
    List<ItemCorrectResp> correctItemBatch(List<ItemCorrectDto> dtos, Long currUserId, Integer type) throws JsonProcessingException;

    /**
     * 评判主观题
     * @param dto 题目答案数据封装
     * @return 评判结果
     */
    ItemCorrectResp correctSubjectItem(ItemCorrectDto dto);

    /**
     * 评判填空题
     * @param dto  题目答案封装
     * @param rank 题目答案等级, all表示全部
     * @return 评判结果
     */
    ItemCorrectResp correctClozeItem(ItemCorrectDto dto, String rank);

    /**
     * 评判每日一练题目答案
     * @param dtos       答案评判数据封装
     * @param currUserId 当前登录用户ID
     * @return 评判结果
     */
    @Transactional
    List<ItemCorrectResp> correctItemBatchByDailyExercise(List<ItemCorrectDto> dtos, Long currUserId);

    /**
     * 评判发布试卷练习答案
     * @param dto        试卷答案DTO
     * @param currUserId 当前用户ID
     * @return 判题结果
     * @throws JsonProcessingException Json序列化异常
     */
    @Transactional
    List<ItemCorrectResp> correctItemBatchByExercise(CorrectExerciseDto dto, Long currUserId) throws JsonProcessingException;
}
